﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Clinica_Frba;
using System.Data.SqlClient;
using System.Security.Cryptography;


namespace Clinica_Frba.UserInterface.Login
{
    

    public partial class Login : Form
    {
        private int intentosFallidos;
        private MenuPrincipal menuAnterior;
        private string string_connection;

        public Login(MenuPrincipal anterior,string conexion)
        {
            InitializeComponent();
            this.string_connection = conexion;
            this.menuAnterior = anterior;
        }

        //Click en el botón Entrar
        private void entrarButton_Click_1(object sender, EventArgs e)
        {
            string conString = this.string_connection;
            string passDb = getDbPasswd();
            string passTextBox = getHashedPasswd();

            if (passDb == passTextBox)
            {
                //Menu_Administrador.Form1 menu = new FrbaBus.Menu_Administrador.Form1(username_textbox.Text, menuAnterior);
                
                //int roles =getRoles(username_textbox.Text,conString);
                List<string> roles = getRoles(username_textbox.Text);                
                LoginAs loginRoles = new LoginAs(roles, this.menuAnterior, this.username_textbox.Text,this.string_connection);
                if (roles.Count > 1)
                {                    
                    loginRoles.Show();
                }
                else
                {
                    MenuPrincipal menPpal = new MenuPrincipal(roles[0], this.username_textbox.Text, menuAnterior,this.string_connection);
                    menPpal.Show();
                }
                this.Hide();

            }
            else
            {
                MessageBox.Show("La contraseña es inválida, ingrese nuevamente");
                this.intentosFallidos++;
                if (this.intentosFallidos == 3)
                {
                    this.menuAnterior.desactivar_login();
                    this.cerrar();
                }

            }
        }

        public void cerrar()
        {
            this.Close();
            this.menuAnterior.Show();
        }
        public void salir() 
        {
            this.Close();
            this.menuAnterior.salir();
        }

        /**
         * Esta funcion se encarga de buscar en la base de datos qué roles tiene asignado el usuario pasado
         * por parámetro. La manera de interpretar el número es según los roles que tiene:
         * Rol administrador: el número tiene un 1 en su centena.
         * Rol afiliado: el número tiene un 1 en su decena.
         * Rol profesional: tiene un 1 en su unidad.
         * Entonces 110 tiene rol admin y afiliado. El 111 tendría todos los roles.
         */
        //private int getRoles(string username,string connString)
        private List<string> getRoles(string username)
        {
            List<string> listResults = new List<string>();
            
            string consulta = "SELECT rol_nombre "+
                "FROM [vacuna_gdd].rol, [vacuna_gdd].usuario_rol "+
                "WHERE rol_id=ur_rol_id and ur_usr_name= '"+username+"'";
            using (SqlConnection conn = new SqlConnection(this.string_connection))
            {
                SqlCommand cmd = new SqlCommand(consulta, conn);
                try
                {
                    conn.Open();                    
                    SqlDataAdapter data = new SqlDataAdapter(consulta, conn);
                    DataSet set = new DataSet();
                    data.Fill(set, "tablaprueba");                    
                    //dataGridView1.DataSource = set.Tables["tablaprueba"];
                    //dataGridView1.Refresh();
                    foreach (DataTable table in set.Tables)
                    {
                        foreach (DataRow row in table.Rows)
                        {                            
                            foreach (DataColumn column in table.Columns)
                            {                                
                                string rowColumn =row[column].ToString();
                                if (rowColumn != "")
                                    listResults.Add(rowColumn);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }finally
                {
                    // cerramos la conexion
                    if (conn.State != ConnectionState.Closed)
                        conn.Close();
                    // destruimos la conexion
                    conn.Dispose();
                }
            }
            return listResults;
        }

        private string getDbPasswd()
        {
            string passDB = "";
            string sql = "SELECT usr_passwd FROM [vacuna_gdd].usuario WHERE usr_name='" + username_textbox.Text + "'";

            using (SqlConnection conn = new SqlConnection(this.string_connection))
            {
                SqlCommand cmd = new SqlCommand(sql, conn);
                try
                {
                    conn.Open();
                    passDB = (string)cmd.ExecuteScalar();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                finally
                {
                    // cerramos la conexion
                    if (conn.State != ConnectionState.Closed)
                        conn.Close();
                    // destruimos la conexion
                    conn.Dispose();
                }
            }
            return passDB;
        }
        private string convertirBytesAstring(byte[] array)
        {
            int i;
            string cadena = "";
            for (i = 0; i < array.Length; i++)
            {
                cadena += String.Format("{0:x2}", array[i]);
            }
            return cadena;
        }

        private string getHashedPasswd()
        {
            string passwd = "";


            SHA256 mySHA256 = SHA256Managed.Create();
            byte[] hashValue;

            hashValue = mySHA256.ComputeHash(Encoding.UTF8.GetBytes(password_textbox.Text));

            for (int i = 0; i < hashValue.Length; i++)
            {
                passwd += String.Format("{0:x2}", hashValue[i]);
            }

            return passwd;
        }
        //Click en el botón CANCELAR:

        private void cancelarButton_Click_1(object sender, EventArgs e)
        {
            this.cerrar();
        }

        public void form_clear()
        {
            this.username_textbox.Text = "";
            this.password_textbox.Text = "";
        }

        private void Login_Load(object sender, EventArgs e)
        {

        }

    }
}
